בג'אווה סריפט אין מחלקות, יש אובייקטים.
כדי ליצור אובייקט חדש שימש לנו כמו מחלקה נעשה ככה:
function obj() {
}
}
נוכל ליצור מופע של האובייקט בקריאה פשוטה לפונקציה
var obj1 = obj();
ונוכל(לרוב עדיף, יוסבר בהמשך) להשתמש במילה השמורה new:
var obj2 = new obj();
בג'אווה סקריפט איו בנאי(קונסטראקטור). כאשר אנחנו יוצרים מופע חדש אנחנו מפעילים את תוכן הפונקציה. אפשר לאמר שהיא הבנאי של עצמה.
אם נרצה להעביר לאובייקט פרמטרים שהוא "יבנה את עצמו" איתם פשוט נעביר פרמטרים לפונקציה.
var obj3 = new obj("smothing to start with.");
משתנים
כדי להגדיר משתנים לאובייקט נוכל לעשות ככה:
function obj() {
var x = 5;
}
var x = 5;
}
ונוכל להשתמש בערך this שמצביע לטווח שבו אנחנו נמצאים
function obj() {
this.x = 5;
}
this.x = 5;
}
נגיד ויש לנו את הסקריפט הבא
var x = 1;
function obj() {
var x = 5;
}
function this_obj() {
this.x = 5;
}
function obj() {
var x = 5;
}
function this_obj() {
this.x = 5;
}
כאשר אנחנו נפעיל את obj באותו טווח עם x. הפונקציה תיצור לעצמה משתנה בשם x ולא תדרוס את המשתנה x שבטווח שלנו. כלומר
obj();
alert(x);
alert(x);
יציג לנו 1.
אבל אם נפעיל את this_obj באותו טווח עם x. הפונקציה תלך לטווח עצמו ותיצור\תשנה את x שם. כלומר
this_ibj();
alert(x);
alert(x);
יציג לנו 5.
אם אנחנו נכתוב פונקציה שתשתמש במילה this אז נצטרך להפעיל אותה דרך new. שימו לב שאתם תקבלו אובייקט ולא תהיה שום השפעה על הטווח שאתם נמצאים בו.
לדוגמה:
function nt() {
this.rly = true;
}
new nt();
this.rly = true;
}
new nt();
לא תהיה שגיאה, אבל זה לא יעשה משהו שימושי(לא יווסף ערך בשם rly בטווח). לכן אנחנו "נלכוד" את הפלט בערך.
var obj2 = new obj();
מתודות.
יצירת מתודות זהה להגדרת משתנים, בגלל שבג'אווה סקריפט פונקציות הן אובייקטים.
function obj() {
ver met = function() {
..
};
}
ver met = function() {
..
};
}
השתמשתי בפונקציה אנונימית בגלל שאין לנו צורך בשם.
בג'אווה בקריפט אין העמסת פרמטרים. לא נוכל לעשות ככה
function obj() {
var meth = function(single) {
..
};
meth = function(more, then, one) {
..
};
}
var meth = function(single) {
..
};
meth = function(more, then, one) {
..
};
}
ואפשר להבין בקלות גם למה אין העמסת פרמטרים.
בג'אווה סקריפט אנחנו לא נוכל להגביל שימוש בפרמטרים או מתודות. אין לנו private/public.
בג'אווה סקריפט לכל אובייקט יש אל טיפוס, הprototype שלו. את האב טיפוס אפשר לשנות בזמן ריצה. הוא לא סטטי. הprototype הוא אובייקט אחר.
כברירת מחדל הprototype של האובייקט יהיה האובייקט Object אבל אפשר לשנות את זה בקלות.
נתחיל עם אובייקט פשוט של נקודה.
function point() {
this.x = 0;
this.y = 0;
}
this.x = 0;
this.y = 0;
}
ועכשיו ניצור נקודה יותר מתקדמת.
function a3DPoint() {
this.z = 0;
this.showcords = function() {
return "(" + this.x + "," + this.y + "," + this.z + ")";
};
}
this.z = 0;
this.showcords = function() {
return "(" + this.x + "," + this.y + "," + this.z + ")";
};
}
וכדי לקשר את האב טיפוס נעשה ככה(מחוץ לפונקציה)
a3DPoint.prototype = new point;
(אם אין פרמטרים אפשר להוריד את הסוגריים.)
שימו לב שהנקודה המתקדמת שלנו "תירש" גם את המאפיינים של האב טיפוס של הנקודה שלנו. אפשר לייצג את זה בשרשרת.
a3DPoint(z, showcords)
|
point(x, y)
|
Object
ג'אווה סקריפט תחפש את הערך או המתודה בשרשרת עד שהיא תמצא אותה ותיעצר.
כדי להגיע לz היא תחפש ב3DPoint ותיעצר.
כדי להגיע לx היא תחפש ב3DPoint, היא לא תמצא כלום ואז היא תחפש אותו בpoint ותיעצר.
בגלל זה אנחנו יכולים לדרוס פונקציות וערכים. אם יש לנו את השרשרת הזאת
obj(a, b)
|
sub(a, c)
כדי להגיע לc ג'אווה סקריפט תחפש בobj, היא לא תמצא כלום ואז היא תמשיך לsub.
אבל כדי להגיע לa ג'אווה סקריפט תחפש בobj, תמצא ותיעצר. היא לא תמשיך לsub.
תגובות לכתבה:
מדריך מעולה :)
מדהים.
ההסבר מצוין וברור. חידש לי על מהות ה new שאף פעם לא הבנתי בשביל מה הוא. תודה רבה.
אגב, אני נזכר במדריך הקודם
( http://phpguide.co.il/javascript_scopes_objects_functions.htm )
והאפשרות של שימוש ב call/apply הם עוד סיבה מצוינת להגדיר מאפיינים של אובייקט עם var x = 1 ולא this.x = 1
תודה אהבתי.
מדריך מצוין שמאוד עזר לי להבין מה זה prototype!